package br.boicotando.server;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;

import br.boicotando.client.GerenciadorLoja;
import br.boicotando.dao.DaoDB;
import br.boicotando.dao.ProdutoDao;
import br.boicotando.dao.ProdutoDaoDB;
import br.boicotando.dao.SetorDao;
import br.boicotando.dao.SetorDaoDB;
import br.boicotando.dominio.Produto;
import br.boicotando.dominio.Setor;
import br.boicotando.persistencia.ECategoria;
import br.boicotando.persistencia.EProduto;
import br.boicotando.persistencia.ESetor;
import br.boicotando.persistencia.ESubCategoria;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class GerenciadorLojaImpl extends RemoteServiceServlet implements
		GerenciadorLoja {
	
	@Override
	public List<Setor> consultarSetores() throws IllegalArgumentException {
		List<Setor> setores = new ArrayList<Setor>();
		List<ESetor> eSetores;
		Session sess = null;
		try {
			sess = DaoDB.abreSessao();
			SetorDao setorDao = new SetorDaoDB(sess);
			eSetores = setorDao.consultarTodos();
			for (ESetor eSetor : eSetores) {
				if (!(eSetor instanceof ECategoria || eSetor instanceof ESubCategoria)) {
					setores.add((Setor) Bau.injetor().injetaA(eSetor).emB(new Setor()));
				}
			}
			sess.close();
		} catch (Throwable ex) {
			if (sess != null && sess.isOpen()) {
				sess.close();
			}
			ex.printStackTrace();
			throw new IllegalArgumentException(ex.getMessage());
		}
		return setores;
	}
	

	/**
	 * Escape an html string. Escaping data received from the client helps to
	 * prevent cross-site script vulnerabilities.
	 * 
	 * @param html the html string to escape
	 * @return the escaped string
	 */
	public String escapeHtml(String html) {
		if (html == null) {
			return null;
		}
		return html.replaceAll("&", "&amp;").replaceAll("<", "&lt;")
				.replaceAll(">", "&gt;");
	}


	@Override
	public List<Produto> consultarProdutoDestaque() throws IllegalArgumentException {
		List<Produto> dProdutos = new ArrayList<Produto>();
		List<EProduto> eProdutos;
		Session sess = null;
		try {
			sess = DaoDB.abreSessao();
			ProdutoDao produtoDao = new ProdutoDaoDB(sess);
			eProdutos = produtoDao.consultarTodos();
			for (EProduto eProduto : eProdutos) {
				dProdutos.add((Produto) Bau.injetor().injetaA(eProduto).emB(new Produto()));
			}
			sess.close();
		} catch (Throwable ex) {
			if (sess != null && sess.isOpen()) {
				sess.close();
			}
			ex.printStackTrace();
			throw new IllegalArgumentException(ex.getMessage());
		}
		return dProdutos;
	}


	@Override
	public List<Produto> consultarProdutos(List<Setor> setores)	throws IllegalArgumentException {
		List<ESetor> eSetores = new ArrayList<ESetor>();
		List<Produto> dProdutos = new ArrayList<Produto>();
		List<EProduto> eProdutos;
		Session sess = null;
		try {
			sess = DaoDB.abreSessao();
			ProdutoDao produtoDao = new ProdutoDaoDB(sess);
			for (Setor dSetor : setores) {
				eSetores.add((ESetor) Bau.injetor().injetaA(dSetor).emB(new ESetor()));
			}
			eProdutos = produtoDao.consultarSetores(eSetores);
			for (EProduto eProduto : eProdutos) {
				dProdutos.add((Produto) Bau.injetor().injetaA(eProduto).emB(new Produto()));
			}
			sess.close();
		} catch (Throwable ex) {
			if (sess != null && sess.isOpen()) {
				sess.close();
			}
			ex.printStackTrace();
			throw new IllegalArgumentException(ex.getMessage());
		}
		return dProdutos;
	}


	@Override
	public List<Produto> consultarProdutos(List<Setor> setores, String descricao) throws IllegalArgumentException {
		List<ESetor> eSetores = new ArrayList<ESetor>();
		List<Produto> dProdutos = new ArrayList<Produto>();
		List<EProduto> eProdutos;
		Session sess = null;
		try {
			sess = DaoDB.abreSessao();
			ProdutoDao produtoDao = new ProdutoDaoDB(sess);
			for (Setor dSetor : setores) {
				eSetores.add((ESetor) Bau.injetor().injetaA(dSetor).emB(new ESetor()));
			}
			eProdutos = produtoDao.consultarSetores(eSetores, descricao);
			for (EProduto eProduto : eProdutos) {
				dProdutos.add((Produto) Bau.injetor().injetaA(eProduto).emB(new Produto()));
			}
			sess.close();
		} catch (Throwable ex) {
			if (sess != null && sess.isOpen()) {
				sess.close();
			}
			ex.printStackTrace();
			throw new IllegalArgumentException(ex.getMessage());
		}
		return dProdutos;
	}

}
